home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / 4cmp22s.zip / EXEC.4TH < prev    next >
Text File  |  1994-10-30  |  2KB  |  64 lines

  1. \ DOS EXECUTE LIBRARY
  2. \ Contents Copyright (C) 1991 by Thomas Almy
  3. \ Revised 6/94 by Tom Almy
  4.  
  5. \ Permission is granted to registered users of ForthCMP to sell or distribute
  6. \ computer programs incorporating the compiled contents of this file.
  7.  
  8. \ This file should be loaded at the start of the program. The
  9. \ STRINGS library must be loaded, and loaded before this file.
  10.  
  11. .( Loading EXEC) CR
  12. 10 HEX
  13. DSEG
  14. CREATE xpb 0E ALLOT 
  15. 0 xpb ! -1 xpb 6 + ! -1 xpb 8 + ! -1 xpb 0A + ! -1 xpb 0C + !
  16. CSEG
  17. CREATE ssav 0 , 0 , 
  18. DSEG
  19.  
  20. \ the code for exec could be optimized based on SEPSSEG? and SEPDSEG?
  21. \ either or both being off, but it would not make that much difference
  22. \ in code size.
  23.  
  24. \ code 9C is PUSHF, 9D is POPF
  25.  
  26. 1 1 IN/OUT 
  27. CODE exec ( ^ASCIIZCommand -- failFlag )
  28.     BP PUSH CSEG 9C C, DS PUSHSEG
  29.     AX DX MOV
  30.     CS: ssav CELL+ [] SS <SEG  SP CS: ssav [] MOV    
  31.     AX DS <SEG  AX ES >SEG
  32.     4B00 # AX MOV
  33.     xpb # BX MOV
  34.     21 INT
  35.     CS: ssav CELL+ [] SS >SEG
  36.     CS: ssav [] SP MOV
  37.     DS POPSEG 9D C, BP POP 
  38.     <U ~ IF, AX AX XOR THEN, RET
  39. END-CODE
  40.  
  41. DSEG
  42. CREATE crChr 3 ALLOT
  43.   0D crChr C!    \ crChr 1 is string consisting of CR only
  44.   20 crChr 1+ C! \ while crChr 1+ 1 is string consisting of BL only
  45.   0 crChr CELL+ C!  \ and crChr CELL+ is counted zero length string
  46.  
  47. 2 1 IN/OUT
  48. : spawn ( ^command ^args -- failFlag )
  49.      crChr 1+ 1  ROT COUNT STRCAT
  50.      crChr 1 STRCAT STRPCK -1 OVER +!
  51.      xpb CELL+ ! ?DS: xpb 4 + !
  52.      ASCIIZ exec
  53. ;  
  54.  
  55. 2 0 IN/OUT
  56. : EXEC
  57.      S" COMSPEC" STR>DSEG getenv ?DUP IF
  58.        -ROT DUP IF \ program to run
  59.            S" /C " STR>DSEG 2SWAP STRCAT STRPCK
  60.        ELSE 2DROP crChr CELL+ THEN
  61.        spawn DROP
  62.      ELSE  ." No COMSPEC" BYE THEN ;
  63. 0A = [IF] DECIMAL [THEN]
  64.